package com.pai4j.act.repository.dao;

import com.pai4j.act.repository.entity.ResourceBehaviorEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface IResourceBehaviorDAO extends JpaSpecificationExecutor<ResourceBehaviorEntity>,
        JpaRepository<ResourceBehaviorEntity, Long> {
    /**
     * 根据用户ID、行为类型、资源类型、资源索引和状态查找资源行为实体
     * @param userId 用户ID
     * @param behaviorType 行为类型
     * @param resourceType 资源类型
     * @param resourceIndex 资源索引
     * @return 符合条件的资源行为实体，如果不存在则返回null
     */
    ResourceBehaviorEntity findByUserIdAndBehaviorTypeAndResourceTypeAndResourceIndexAndStatusTrue(
            String userId, String behaviorType, String resourceType, Long resourceIndex);


    /**
     * 统计指定行为类型、资源类型和资源索引下状态为true的资源行为数量
     * @param behaviorType 行为类型
     * @param resourceType 资源类型
     * @param resourceIndex 资源索引
     * @return 符合条件的资源行为数量
     */
    Long countByBehaviorTypeAndResourceTypeAndResourceIndexAndStatusTrue(
            String behaviorType, String resourceType, Long resourceIndex);


    /**
     * 根据用户ID、行为类型和资源类型查找所有状态为true的资源行为实体
     * 查询返回资源索引和更新日期信息
     * @param userId 用户ID
     * @param behaviorType 行为类型
     * @param resourceType 资源类型
     * @return 符合条件的资源行为实体列表
     */
    @Query(value = "select rbe " +
            "from ResourceBehaviorEntity rbe " +
            "where rbe.userId = :userId and rbe.status = true and rbe.behaviorType = :behaviorType" +
            " and rbe.resourceType = :resourceType")
    List<ResourceBehaviorEntity> findAllByUserBehaviorResource(
            String userId, String behaviorType, String resourceType);


    /**
     * 根据资源ID、行为类型和资源类型查找所有状态为true的资源行为实体
     * 查询返回用户ID和更新日期信息
     * @param resourceId 资源ID
     * @param behaviorType 行为类型
     * @param resourceType 资源类型
     * @return 符合条件的资源行为实体列表
     */
    @Query("select rbe " +
            "from ResourceBehaviorEntity rbe " +
            "where rbe.status = true and rbe.behaviorType = :behaviorType " +
            " and rbe.resourceType = :resourceType and rbe.resourceIndex = :resourceId")
    List<ResourceBehaviorEntity> findAllByResourceBehaviorUser(
            Long resourceId, String behaviorType, String resourceType);


}
